#include "loaddomainquerytask.h"
#include "domainquerytask.h"


LoadDomainQueryTask::LoadDomainQueryTask(const QVector<SocketDnInfo> &vsdi,QObject *parent)
    : QObject{parent}
{
    threadPool.setMaxThreadCount(20); // 限制线程池的最大线程数
    m_stopThread = false;
    m_allDoman = vsdi;
}

LoadDomainQueryTask::~LoadDomainQueryTask()
{
    qDebug()<<__FUNCTION__<<"我要退出LoadDomainQueryTask线程";
}
void LoadDomainQueryTask::run()
{
    qDebug()<<__FUNCTION__<<"开始LoadDomainQueryTask线程的run";
   // emit started();
    //qDebug()<<m_allDoman.size();
    //batchQueryDomain(m_allDoman);
    int activeThreads,queueSize;
    //int maxThreads = threadPool.maxThreadCount();
    int submittedTasks = 0;
    QAtomicInt finishedTasks{0};
    int totalNum = m_allDoman.size();
    for (int i = 0; i < totalNum; i++) {
            if(m_stopThread )
            {
                qDebug()<<"提前终止线程,开始等待剩下任务完成";
                threadPool.clear();
                threadPool.waitForDone();// 等待所有任务完成
                activeThreads = threadPool.activeThreadCount();
                queueSize = submittedTasks - finishedTasks - activeThreads;
                qDebug()<<"查看队列是否完成: "<<queueSize<<submittedTasks <<finishedTasks<< activeThreads;
                qDebug()<<"所有剩下任务已经完成,退出LoadDomainQueryTask的run";
                //emit taskInterrupt();
                delete this;
                return;
            }
        SocketDnInfo sdi = m_allDoman[i];
        DomainQueryTask *task = new DomainQueryTask(finishedTasks,sdi);
        connect(task, &DomainQueryTask::validationResult,
                this, [this, sdi](QByteArray data,QString reqParam){
                    if(data.length())
                    {
                        qDebug()<<__FUNCTION__<<"in LoadDomainQueryTask recv result  from DomainQueryTask"<<reqParam;
                            // emit result(data, reqParam); // 假设result是LoadAndValidateProxyTask的一个信号
                            // 或者直接处理结果，例如：
                            // handleValidationResult(validatedProxy, success);
                    }
                });
        connect(this, &LoadDomainQueryTask::finishedTask, task, &DomainQueryTask::stopTask);
        threadPool.start(task);
        submittedTasks++; // 提交任务计数加1
        // 每隔一段时间检查队列大小
        if (submittedTasks% 50 == 0) { // 每提交100个任务检查一次
            activeThreads = threadPool.activeThreadCount();
            // 任务队列中的任务数量
            queueSize = submittedTasks - finishedTasks - activeThreads;

            if(queueSize>50)
            {
                qDebug()<<"查看队列的大小,超过50,开始休眠10s: "<<queueSize<<submittedTasks <<finishedTasks<< activeThreads;
                QThread::sleep(10);
            }
        }
    }
    qDebug()<<"任务已发送完成，开始等待队列所有任务完成";
    threadPool.waitForDone();// 等待所有任务完成
    qDebug()<<"所有任务已经完成,退出LoadDomainQueryTask的run";
    QThread::sleep(3);//当请求较少时，避免请求发送完成，入库线程的队列还没有数据的情况，会导致提前退出。
    emit taskFinish();
    delete this;

}
void LoadDomainQueryTask::stopThread()
{
    qDebug() <<  "接收 stopDnQryThread 信号";

    m_stopThread = true;
   // qDebug()<<threadPool.activeThreadCount();

    //emit finishedTask();
}

void LoadDomainQueryTask::batchQueryDomain(const QVector<SocketDnInfo>& domainStrs)
{
    // int queueSize;
    // int submittedTasks =0;
    // int batchSize = 20; // 每批次验证的数量
    // int totalNum = domainStrs.size();
    // for (int i = 0; i <totalNum ; i += batchSize) {
    //     if(m_stopThread )
    //     {
    //         qDebug()<<"停止发送数据，终止线程";
    //         emit finished();
    //         return;
    //     }

    //     int end = qMin(i + batchSize, totalNum);
    //     //qDebug()<<i<<i+batchSize<<end<<totalNum;
    //     for (int j = i; j < end; ++j) {
    //         SocketDnInfo sdi = domainStrs[j];
    //         DomainQueryTask *task = new DomainQueryTask(sdi);
    //         // 确保连接的槽函数与信号匹配
    //         connect(task, &DomainQueryTask::validationResult,
    //                 this, [this, sdi](QByteArray data,QString reqParam){
    //                 if(data.length())
    //                     {
    //                 qDebug()<<__FUNCTION__<<QThread::currentThreadId()<<"in LoadDomainQueryTask recv result  from DomainQueryTask"<<reqParam;
    //                    // emit result(data, reqParam); // 假设result是LoadAndValidateProxyTask的一个信号
    //                     // 或者直接处理结果，例如：
    //                     // handleValidationResult(validatedProxy, success);
    //                 }
    //                 });
    //         connect(this, &LoadDomainQueryTask::finishedTask, task, &DomainQueryTask::stopTask);
    //         threadPool.start(task);
    //         submittedTasks ++;

    //         if(curNum%100==0)
    //         {
    //             queueSize = curNum-;
    //             qDebug()<<"查看队列的大小,超过100,休眠10s: "<<queueSize;
    //             if(queueSize>100)
    //                 QThread::sleep(10);
    //         }
    //         //qDebug()<<__FUNCTION__<<QThread::currentThreadId()<<"in LoadDomainQueryTask start DomainQueryTask thread"<<sdi.reqParam;
    //     }
    //     if(curNum%100==0)
    //     {
    //         // queueSize = threadPool.queueSize();
    //         qDebug()<<"查看队列的大小,超过100,休眠10s: "<<queueSize;
    //          if(queueSize>100)
    //              QThread::sleep(10);
    //     }
    //      QThread::sleep(1);
    //     //qDebug()<<"sleep 1s ";
    //     //emit progress(i + batchSize, proxies.size()); // 更新进度
    // }
    // qDebug()<<"开始等待所有任务完成";
    // threadPool.waitForDone();// 等待所有任务完成
    // qDebug()<<"所有任务已经完成";
}
